perm filename IBMDSK[D,SYS] blob sn#260117 filedate 1977-02-01 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00020 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	TITLE IBMDSK
C00005 00003	LOC 200
C00008 00004	BITS FOR COMMAND WORD
C00010 00005	DEFINE MES(A)
C00012 00006	UUO HANDLER
C00013 00007	HANDLE THE CTY.
C00015 00008	UUO ROUTINES, GETWRD
C00018 00009	DDTCAL:	OUTSTR	[ASCIZ/*DDT*/]
C00024 00010	SKIP:	CAIE A,12
C00026 00011		DOREAD, DOWRITE, TRKSET, READ, WRITE, RDR0
C00031 00012	THE FOLLOWING CODE READS GRIMM'S FAIRY TALES FROM A 370 FORMAT PACK.
C00037 00013	FORMAT:	TDZA	T,T
C00040 00014	FORMAT ONE TRACK
C00044 00015	SEEKIT:	SETZM SKDAT
C00048 00016	DOSENSE:PUSHJ P,SENSE
C00050 00017	DIAG:	PUSHJ P,LOAD
C00053 00018	DOCMD:	TRNE A,20000		SHOULD WE SEND WCMA
C00057 00019	ESENSE:	AOS ERRCNT
C00060 00020	STTPNT:	OUTSTR[ASCIZ/CONI BITS = /]
C00062 ENDMK
C⊗;
TITLE IBMDSK

EXTERNAL DDT

.LOAD	SYS:EDDT.REL

LOC 74
JRST DDT		;KEEP SYMBOLS AROUND
RELOC

P←17

A←1
B←2
C←3
D←4
E←5
F←6

ISTAT←13		;INITIAL STATUS STORED HERE
T←14
TT←15
TTT←16

APR←←0
PMP←←500
IBM←←504
TTY←←120
CCA←←14
KLPAG←←10

SWEEPB←←200000		;SWEEP BUSY IN KL10 APR CONI.


;KL10 TO CONSOLE
DTE←←200
DONG11←←20000		;RING 11'S DOORBELL
DTFLG←←444		;DTE20 OPERATION COMPLETE FLAG (RELATIVE TO EPT)
DTF11←←450		;      10 FROM 11 ARGUMENT
DTCMD←←451		;      TO 11 COMMAND WORD

;CONI BITS FOR PMP
UNEND←←440000		;UNEND AND PARITY ERROR
CHE←←200000
NEWST←←20000
;STATUS BITS
STMOD←←4000
CUEND←←2000
BUSY←←1000
CHEND←←400
DEVEND←←200
UCHK←←100
UXCPTN←←40

;LEFT HALF BIT FOR CONI PMP (500)
SELERR←←40000		;SELECT ERROR

;CONO BITS FOR IBM (504)
CLREND←←4000	;CLEAR UN END
CNEWST←←200
CLRSTS←←40
CLRCHL←←20	;CLEAR COMMAND HOLD LOADED
IRESET←←2
RESET←←1

NOPLIN←←10000	;NOT OPL IN (CONI 504)

;DEVICE ADDRESSES
D3330←←14
LOC 200

BEGIN:	JRST STRT	;DISPATCH TO MAIN LOOP
	JRST DDT	;DISPATCH TO DDT
RSTLOC:	JRST STRT	;SET TO RESTART LOC BY STRT

LOC 1000		;LEAVE ROOM FOR KL10 EPT AT PHYSICAL ZERO

R2:
SPOPJ2:
CPOPJ2:	AOS (P)
R1:
SPOPJ1:
CPOPJ1:	AOS (P)
R:
CPOPJ:	POPJ P,

PPOPJ:	POP P,(P)
	POPJ P,

DEBUG:	0

DEFINE DEBCHECK
{	SKIPE DEBUG
	PUSHJ P,DDTCAL
}

STATLEN←←100

DEFINE GETSTAT
{	CONI PMP,ISTAT
	CONO IBM,CNEWST
	TRNE ISTAT,UNEND
	CONO IBM,CLRCHL
	AOSL T,STATPNT
	JRST [	MOVNI T,STATLEN
		MOVEM T,STATPNT
		JRST .+1]
	MOVEM ISTAT,STATEND(T)
}

;DATA AREA

STATBEG:	BLOCK STATLEN
STATEND←←.

STATPNT:	0


RWFIRST:	0
RWLAST:		0
RWLOC:		0
SRCNUM:		0
OSFMTF:		0		;SET TO -1 FOR WRITING OS-370 FORMAT
RECNM1:		0		;SET TO FIRST RECORD NUMBER DESIRED,
				;OR -1 FOR ENTIRE NORMAL TRACK
RECNM2:		0		;SET TO LAST RECORD DESIRED, OR -1 FOR NORMAL
SKIPF:		0		;SET TO -1 TO SKIP RETURN FROM READN

RETLEN←←40
RETBYT←←RETLEN/2*9
RECLEN←←200
RECBYT←←RECLEN/2*9
IFL RECLEN-RETLEN,<PRINTX CODE EXPECTS RETLEN ≤ RECLEN>

KEYBYT←←60*9/2		;PAD RECORD 0 KEY WITH 60 WORDS
MAXDRV←←7
TRKCYL←←=19
CYLPC1←←=411		;SINGLE DENSITY
CYLPAC←←=815		;DOUBLE DENSITY
MAXTRK←←TRKCYL*CYLPAC-1		;NUMBER OF TRACKS-1
RCPTRK←←=18

TRACK:	0		;TRACK NUMBER IS KEPT HERE
DRIVE:	0
ADDR:	D3330⊗=17	;DEVICE CODE FOR DATAO
TSTXOR:	D3330⊗=27	;XOR TEST AT ESTAT

ISTATC:	0

RWCMD:	0

ECOUNT:	0

PATCH:	BLOCK 200	;PATCH SPACE

PDL:	BLOCK 1000

RTYCNT:	0		;COUNT OF NUMBER OF RETRIES
CUBCNT:	0		;COUNT OF NUMBER OF CONTROL UNIT BUSY SEQUENCES
ERRCNT:	0		;COUNT OF NUMBER OF CALLS ON ESENSE

QUIET:	0		;NO PRINTOUT FROM ESENSE IF ON

CNT:	0		;PLACE TO KEEP TRY COUNT
CRLF:	BYTE (7) 15,12,0

KLFLG:	0		;NON ZERO IF THIS IS A KL10
UUOLOC:	0		;ADDRESS OF THE UUO IMAGE AND TRAP INSTRUCTION WORDS
;BITS FOR COMMAND WORD
DT←←20000	;COMMAND REQUIRES DATA TRANSFER
BY4←←10000	;4 BYTE MODE
CB←←4000	;COUNT BYTES (NOT WORDS)
CHAIN←←2000	;COMMAND CHAINING
SMT←←1000	;SKIP IF STATUS MODIFIER ON
SMF←←400	; "   "    "        "    OFF

TSTBUF:	BLOCK =512/4+2

ERRBUF:	BLOCK =512/4+2

FILMSK:	BYTE(8)300	;PERMIT ALL WRITES

SKDAT:	BLOCK 2

SKCYL:	POINT 16,SKDAT,31
SKHD:	POINT 8,SKDAT+1,15

HADAT:	BLOCK 2

HACYL:	POINT 16,HADAT,23
HAHD:	POINT 8,HADAT+1,7

SNSDAT:	BLOCK 10

DEFINE BYTIT(BUF,BYT)
{	XWD <(<POINT 8,0,7+8*(BYT-BYT/4*4)>)>,BUF+BYT/4
}

AREA←←400000
B0DAT←←AREA
BNDAT←←B0DAT+4
BMDAT←←BNDAT+4
ENDDAT←←BMDAT+3
TRKBUF←←ENDDAT+1
DATBEG←←TRKBUF+RCPTRK*200+40+2

W0CYL:	POINT 16,B0DAT,15
W0HD:	BYTIT	B0DAT,3
W0KL:	BYTIT	B0DAT,5
W0DL0:	BYTIT	B0DAT,6
W0DL1:	BYTIT	B0DAT,7


WNCYL:	POINT 16,BNDAT,15
WNHD:	BYTIT	BNDAT,3
WNRN:	BYTIT	BNDAT,4
WNDL0:	BYTIT	BNDAT,6
WNDL1:	BYTIT	BNDAT,7

WMCYL:	POINT 16,BMDAT,15
WMHD:	BYTIT	BMDAT,3
WMRN:	BYTIT	BMDAT,4
WMDL0:	BYTIT	BMDAT,6
WMDL1:	BYTIT	BMDAT,7
DEFINE MES(A)
{	[ASCIZ/A
/]
}

SNBY0:	MES	SEEK CHECK
	MES	TRACK CONDITION CHECK
	MES	OVERRUN
	MES	DATA CHECK
	MES	EQUIPMENT CHECK
	MES	BUS OUT PARITY
	MES	INTERVENTION REQUIRED
	MES	COMMAND REJECT

SNBY1:	MES	OVERFLOW INCOMPLETE
	MES	WRITE LOCK.
	MES	FILE PROTECTED
	MES	NO RECORD FOUND
	[0]
	MES	END OF CYLINDER
	MES	INVALID TRACK FORMAT
	MES	PERMANENT ERROR

DSTAT:	14,,MES		OK
	114,,MES	OK
	10,,MES		OK
	104,,MES	OK
	4,,MES		OK
	16,,MES		ERROR
	6,,MES		ERROR
	120,,MES	CONTROL UNIT BUSY
	160,,MES	CONTROL UNIT BUSY AND END
	112,,MES	COMMAND RETRY
	116,,MES	COMMAND RETRY
	1,,MES		END OF FILE
	15,,MES		END OF FILE
	11,,MES		END OF FILE
DSTATL←←.-DSTAT

STATAB:	MES	ATTENTION
	MES	STATUS MODIFIER
	MES	CU END
	MES	BUSY
	MES	CHAN END
	MES	DEV END
	MES	UNIT CHECK
	MES	UNIT XCPTN
;UUO HANDLER

OPDEF PUTCHR[1B8]
OPDEF GETCHR[2B8]
OPDEF OUTSTR[3B8]
OPDEF OCTPNT[4B8]
OPDEF LOCPNT[5B8]
OPDEF DECPNT[6B8]
OPDEF SIXOUT[7B8]
OPDEF ERROR[10B8]		;THIS MUST BE AN LUUO FOR THE KL10


UUOCON:	0
	PUSH P,UUOCON		;SAVE THE RETURN ADDRESS
	PUSH P,T
	PUSH P,TT
	PUSH P,TTT
	LDB T,[POINT 9,@UUOLOC,8]
	CAIL T,UUOLEN
	MOVEI T,0
	PUSHJ P,@UUODIS(T)
UUORET:	POP P,TTT
	POP P,TT
	POP P,T
	POPJ P,

UUODIS:	ERR
	%PUTCHR
	%GETCHR
	%OUTSTR
	%OCTPNT
	%LOCPNT
	%DECPNT
	%SIXOUT
	ERR
UUOLEN←←.-UUODIS

ERR:	OUTSTR[ASCIZ/π?
/]
	POPJ P,
;HANDLE THE CTY.

DTEXX:	MOVEM	T,DTCMD
	SETZM	DTFLG			;CLEAR 11'S RESPONSE FLAG
	CONO	DTE,DONG11		;RING FOR 11
	SKIPN	DTFLG			;WAIT FOR RESPONSE
	JRST	.-1
	MOVE	T,DTF11			;GET 11'S RESPONSE WORD
	POPJ	P,

KLTYO:	PUSH	P,T
	ANDI	T,177
	PUSHJ	P,DTEXX
	POP	P,T
	POPJ	P,

KLTYI:	MOVEI	T,3400
	PUSHJ	P,DTEXX
	JUMPE	T,CPOPJ
	CAIL	T,"A"+40
	CAILE	T,"Z"+40
	CAIA
	SUBI	T,40
	JRST	CPOPJ1

PUTTTY:	SKIPE	KLFLG
	JRST	KLTYO
	CONSZ	TTY,20		;LAST OUTPUT DONE?
	JRST	.-1
	DATAO	TTY,T		;ECHO
	POPJ	P,

SKPTTI:	SKIPE	KLFLG		;IF NO INPUT, RETURN; ELSE READ IT AND SKIP
	JRST	KLTYI
	CONSO	TTY,40		;ANY INPUT?
	POPJ	P,		;NO.
	DATAI	TTY,T
	ANDI	T,177
	JRST	CPOPJ1

GETTTY:	PUSHJ	P,SKPTTI	;ANY INPUT?
	JRST	.-1		;NO WAIT FOR IT.
	CAIN	T,177		;RUBOUT?
	JRST	RUBOUT
	PUSHJ	P,PUTTTY	;ECHO
	CAIE	T,15		;CR?
	CAIN	T,12
	CAIA
	POPJ	P,
	PUSH	P,T
	TRC	T,7		;CHANGE 15 TO 12 AND VICE VERSA
	PUSHJ	P,PUTTTY
	POP	P,T
	POPJ	P,

RUBOUT:	MOVEI	T,"X"
	PUSHJ	P,PUTTTY
	MOVEI	T,"X"
	PUSHJ	P,PUTTTY
	MOVEI	T,"X"
	PUSHJ	P,PUTTTY
	MOVEI	T,15
	PUSHJ	P,PUTTTY
	MOVEI	T,12
	PUSHJ	P,PUTTTY
	JRST	MAIN		;MAIN WILL RESET THE STACK

;UUO ROUTINES, GETWRD

%OUTSTR:HRRZ	TT,@UUOLOC	;GET EFFECTIVE ADDRESS OF UUO
	HRLI	TT,(<POINT 7,0>)
	ILDB	T,TT
	JUMPE	T,CPOPJ
	PUSHJ	P,PUTTTY
	JRST	.-3

%PUTCHR:PUSH	P,T
	HRRZ	T,@UUOLOC
	PUSHJ	P,PUTTTY
	POP	P,T
	POPJ	P,

%GETCHR:PUSH	P,T
	PUSHJ	P,GETTTY
	PUSH	P,TT
	HRRZ	TT,@UUOLOC	;EFFECTIVE ADDRESS OF UUO
	MOVEM	T,(TT)
	POP	P,TT
	POP	P,T
	POPJ	P,

%OCTPNT:HRRZ	TT,@UUOLOC	;EFFECTIVE ADDRESS OF UUO
	MOVE	TT,(TT)		;FETCH WORD
	MOVEI	TTT,=12
OCTLOP:	SETZ	T,
	LSHC	T,3
	ADDI	T,60
	PUSHJ	P,PUTTTY
	SOJG	TTT,OCTLOP
	POPJ	P,

%DECPNT:SKIPA	T,[=10]
%LOCPNT:MOVEI	T,10
	MOVE	TT,@UUOLOC
	MOVE	TT,(TT)
LOCLOP:	IDIVI	TT,(T)
	HRLM	TTT,(P)
	JUMPE	TT,.+2
	PUSHJ	P,LOCLOP
	HLRZ	T,(P)
	ADDI	T,60
	JRST	PUTTTY

%SIXOUT:MOVE	TT,@UUOLOC
	MOVE	TT,(TT)
SIXOU1:	JUMPE	TT,CPOPJ
	SETZ	T,
	LSHC	T,6
	ADDI	T,40
	PUSHJ	P,PUTTTY
	JRST	SIXOU1

GETWRD:	SETZ B,
	MOVE C,[POINT 6,B]
GETWR1:	GETCHR A
	CAIGE A,"0"
	POPJ P,
	CAIG A,"9"
	JRST CHROK
	CAIGE A,"A"
	POPJ P,
	CAILE A,"Z"
	POPJ P,
CHROK:	SUBI A,40
	TLNE C,770000
	IDPB A,C
	JRST GETWR1

READN:	SETZB	T,SKIPF		;GET A NUMBER.  SKIPS IF NUMBER SEEN
READN1:	GETCHR	A
	CAIL	A,"0"
	CAILE	A,"9"
	JRST	SKPOPJ		;SKIP OR NOT
	IMULI	T,=10
	ADDI	T,-60(A)
	SETOM	SKIPF
	JRST	READN1

SKPOPJ:	SKIPE	SKIPF
	AOS	(P)
	POPJ	P,

GETYES:	OUTSTR	[ASCIZ/GO ON?/]
GETYS1:	GETCHR	A
	OUTSTR	CRLF
	CAIN	A,"D"
	JRST	DDTCAL				;GO TO DDT
	CAIN	A,"Y"
	AOS	(P)
	POPJ	P,
DDTCAL:	OUTSTR	[ASCIZ/*DDT*/]
	JRST	DDT

STRT:	SETZM	KLFLG			;ASSUME NOT A KL10
	MOVE	T,[T,,T]
	BLT	T,T
	CAME	T,[T,,T]
	SETOM	KLFLG
	SKIPE	KLFLG
	JRST	KLSTRT			;DO KL10 INITIALIZATION.
	CONO	APR,10000		;CLEAR NXM FLAG
	SETZ	T,
NXMCHK:	MOVE	(T)
	CAIG	T,777777
	CONSZ	APR,10000		;NXM?
	JRST	NXMDON
	ADDI	T,20000			;INC BY 8K
	JRST	NXMCHK

NXMDON:	SUBI	T,1
	MOVEM	T,37			;SET JOBREL TO FIRST NXM-1
	MOVE	T,[JSR UUOCON]
	MOVEM	T,141
	MOVEI	T,140
	MOVEM	T,UUOLOC
	JRST	RESTRT

KLSTRT:	DATAO	KLPAG,[400100,,0]	;START OUT WITH SOME DECENT ACS
	CONSZ	APR,SWEEPB		;WAIT FOR SWEEP BUSY TO FALL
	JRST	.-1
	CONSO	KLPAG,600000		;IS THE CACHE ON ALREADY?
	JRST	KLSTR1			;NO.
	BLKO	CCA,			;VALIDATE CORE
	CONSZ	APR,SWEEPB
	JRST	.-1
KLSTR1:	CONO	KLPAG,0			;NO CACHE, EPT TO ZERO. NO MAP, NO TRAPS
	DATAI	CCA,0			;SWEEP CACHE.  INVALIDATE ALL.
	CONSZ	APR,SWEEPB		;WAIT FOR SWEEP BUSY TO FALL
	JRST	.-1
	MOVEI	T,-1
	MOVEM	T,37			;SET JOBREL FOR DDT.
	MOVE	T,[JSR UUOCON]
	MOVEM	T,41
	MOVEI	T,40
	MOVEM	T,UUOLOC



RESTRT:	SETZM	STATPNT			;INITIALIZE STATUS SAVER
	MOVE	T,[JRST RESTRT]		;SETUP RESTART LOC
	MOVEM	T,RSTLOC
	SETOM	RECNM1			;ASSUME NORMAL TRACK READS & WRITES
	SETOM	RECNM2
	MOVE	P,[IOWD 1000,PDL]
	CONO	APR,200000		;IO RESET
	OUTSTR	CRLF
	PUSHJ	P,BLAST			;CLEAR CHANNEL
	SETZM	QUIET			;START LOUD
	PUSHJ	P,CNTPNT		;FLUSH OUT COUNTS
MAIN:	MOVE	P,[IOWD 1000,PDL]
	PUTCHR	"*"
	PUSHJ	P,GETWRD
	CAIN	A,"?"
	JRST	DOHELP
	MOVSI	T,770000
	SETZ	D,
MAINLM:	TDNE	B,T
	TDO	D,T
	LSH	T,-6
	JUMPN	T,MAINLM
	MOVSI	C,-DISLEN
	SETZ	TT,
MAINLP:	CAMN	B,COMTAB(C)
	JRST	GOTITL
	MOVE	T,COMTAB(C)
	AND	T,D
	CAME	T,B
	JRST	MAINLQ
	JUMPN	TT,MAINLS
	MOVE	TT,C
MAINLQ:	AOBJN	C,MAINLP
	JUMPE	TT,MAINLS
	SKIPA	C,TT
GOTIT1:	GETCHR	A
GOTITL:	CAIE	A,40
	CAIN	A,11
	JRST	GOTIT1		;IGNORE SPACES AND TABS AFTER COMMAND
	CAIE	A,"/"		;SET SOMETHING?
	JRST	GOTCOM		;NO
	GETCHR	A
	CAIN	A,"P"
	JRST	SETPAK
	CAIN	A,"T"
	JRST	SETTRK
	CAIN	A,"C"
	JRST	CYLHD
	CAIN	A,"R"		;SET RECORD NUMBER TO READ - IN 4-BYTE MODE
	JRST	SETREC
	JRST	MAINLS

SETPAK:	PUSHJ	P,READN
	JFCL
	CAILE	T,MAXDRV
	JRST	ILLDRV
	MOVEM	T,DRIVE
	DPB	T,[POINT 3,ADDR,21]
	LDB	T,[POINT 8,ADDR,21]
	DPB	T,[POINT 8,TSTXOR,11]
	JRST	GOTITL

SETTRK:	PUSHJ	P,READN
	JFCL
TRKCHK:	CAILE	T,MAXTRK
	JRST	ILLTRK
	MOVEM	T,TRACK
	JRST	GOTITL

SETREC:	PUSHJ	P,READN
	JRST	SETRC1			;NO NUMBER
	MOVEM	T,RECNM1		;SET FIRST RECORD NUMBER TO READ/WRITE
	CAIN	A,"-"			;/Rn1-n2 SETS LOWER AND UPPER RECORD NUMBERS
	PUSHJ	P,READN
	MOVE	T,RECNM1		;DEFAULT VALUE IS SAME AS FIRST
	MOVEM	T,RECNM2		;SET LAST RECORD NUMBER TO READ/WRITE
	JRST	GOTITL			;ALLOWS NONSTANDARD FMTS

SETRC1:	SETOM	RECNM1			;/R WITH NO NUMBER MEANS ENTIRE TRACK
	SETOM	RECNM2			;IN NORMAL FORMAT
	JRST	GOTITL

CYLHD:	PUSHJ	P,READN
	JFCL
	MOVE	B,T
	IMULI	B,TRKCYL
	SETZ	T,
	CAIN	A,"+"
	PUSHJ	P,READN
	JFCL
	ADD	T,B
	JRST	TRKCHK

GOTCOM:	CAIE	A,12
	CAIN	A,15
	CAIA
	JRST	MAINLS
	XCT	COMDIS(C)
	JRST	MAIN

ILLDRV:	OUTSTR	[ASCIZ/ILLEGAL DRIVE
/]
	JRST	MAINLS

ILLTRK:	OUTSTR[ASCIZ/ILLEGAL TRACK
/]

MAINLS:	PUSHJ	P,SKIP
	JRST	[OUTSTR	CRLF
		JRST MAIN]
	ERROR
	JRST	MAIN

DOHELP:	PUSH	P,[MAIN]		;SET RETURN ADDRESS
HELP:	MOVE	A,[-DISLEN+1,,1]
	OUTSTR	CRLF
HELPL:	SIXOUT	COMTAB(A)
	OUTSTR	CRLF
	PUSHJ	P,SKPTTI	;ANY TYPEIN?  READ IT AND SKIP.
	AOBJN	A,HELPL		;NO TYPEIN, CONTINUE TYPEOUT
	POPJ	P,
SKIP:	CAIE A,12
	CAIN A,15
	JRST CPOPJ1
	CAIN A,176		;ALTMODE
	POPJ P,			;ALTMODE RETURN
	GETCHR A
	JRST SKIP

COMTAB:	0
	'DDT   '
	'FORMAT'
	'READ  '
	'WRITE '
	'SENSE '
	'NOOP  '
	'SEEK  '
	'HAREAD'
	'RECAL '
	'SECTOR'
	'RSECTO'
	'BLAST '
	'IBLAST'
	'ERRCNT'
	'QUIET '
	'TALK  '
	'RRBL  '
	'TEST  '
	'UTEST '
	'LOAD  '
	'RDR0  '		;READ R0 - ASSUMES NOTHING ABOUT FORMAT?
	'OSFMT '		;FORMAT A PACK FOR OS-370 TO READ
	'HELP  '
DISLEN←←.-COMTAB

COMDIS:	JFCL
	PUSHJ P,DDTCAL
	PUSHJ P,FORMAT
	PUSHJ P,DOREAD
	PUSHJ P,DOWRITE
	PUSHJ P,DOSENSE
	PUSHJ P,DONOOP
	PUSHJ P,DOSEEK
	PUSHJ P,HAREAD
	PUSHJ P,DORECAL
	PUSHJ P,SECTOR
	PUSHJ P,RSECTOR
	PUSHJ P,BLAST
	PUSHJ P,IBLAST
	PUSHJ P,CNTPNT
	SETOM QUIET
	SETZM QUIET
	PUSHJ P,BUFLOG
	PUSHJ P,DIAG
	PUSHJ P,UDIAG
	PUSHJ P,DOLOAD
	PUSHJ P,RDR0
	PUSHJ P,OSFMT
	PUSHJ P,HELP
;	DOREAD, DOWRITE, TRKSET, READ, WRITE, RDR0

RDR0:	SETZM	RECNM1		;SET FOR RECORD 0 ONLY
	SETZM	RECNM2
DOREAD:	PUSHJ	P,TRKSET
	PUSHJ	P,READ
	OUTSTR	[ASCIZ/READ ERROR!
/]
	POPJ	P,

DOWRITE:PUSHJ	P,TRKSET
	PUSHJ	P,WRITE
	OUTSTR	[ASCIZ/WRITE ERROR!
/]
	POPJ	P,

TRKSET:	SKIPGE	T,RECNM1	;SKIP IF FIRST RECORD WAS SPECIFIED
	MOVEI	T,0		;NORMAL ENTIRE TRACK MODE
	MOVEM	T,RWFIRST	;SET FIRST RECORD NUMBER TO READ

	SKIPGE	T,RECNM2	;SKIP IF LAST RECORD NUMBER WAS SPECIFIED
	MOVEI	T,RCPTRK	;NORMAL - DO ENTIRE TRACK
	MOVEM	T,RWLAST	;SET LAST RECORD TO READ

	MOVEI	T,TRKBUF
	MOVEM	T,RWLOC		;READ DATA INTO TRKBUF
	POPJ	P,

WRITE:	SKIPA T,[CHAIN!DT!5]
READ:	MOVEI T,CHAIN!DT!6
	SKIPL	RECNM1		;SKIP IF THIS IS NORMAL READ/WRITE
	IORI	T,BY4		;SET 4-BYTE MODE FOR SINGLE RECORD READ
	MOVEM	T,RWCMD		;SAVE READ/WRITE COMMAND
	MOVE	T,RWLAST	;LAST RECORD #
	SUB	T,RWFIRST	;-FIRST RECORD NUMBER
	ADDI	T,1		;+1 = NUMBER OF RECORDS TO READ
	IMULI	T,3		;RETRY EACH 3 TIMES
	MOVEM	T,ECOUNT
REDAGN:	PUSHJ	P,SEEKIT	;DO SEEK
	JRST	ECHK
	SETZM BNDAT
	SETZM BNDAT+1
	MOVE T,TRACK
	IDIVI T,TRKCYL
	DPB T,WNCYL
	DPB TT,WNHD
	MOVE A,ADDR
	TRO A,DT!BY4!CB!CHAIN!SMF!61	;SEARCH ID EQUAL
	MOVEI B,BNDAT
	MOVE C,ADDR
	TDO C,RWCMD
	MOVE D,RWLOC			;DATA GOES TO (COMES FROM) HERE
	MOVE E,RWFIRST			;FIRST RECORD
REREAD:	DPB E,WNRN
	SETZM SRCNUM
RSRCH:	DATAO PMP,B
	DATAO IBM,A
RSTUFF:	CONSO PMP,CHE			;WAIT FOR COMMAND HOLD EMPTY
	JRST .-1
	CAML E,RWLAST
	TRZ C,CHAIN			;CLEAR CHAINING ON LAST RECORD
	DATAO PMP,D
	DATAO IBM,C
	PUSHJ P,ESTAT			;WAIT FOR ENDING STATUS OF SEARCH
	JRST RSRCH1			;RETRY SEARCH
	JRST ECHKA
	TRNN ISTAT,STMOD		;STATUS MODIFIER?
	JRST RSRCH1			;NO, TRY AGAIN
	SETZM SRCNUM		;RESET SEARCH COUNT
	ADDI E,1
	CAMLE E,RWLAST
	JRST RWDONE
	DPB E,WNRN
	CONSO PMP,CHE
	JRST .-1
	DATAO PMP,B
	DATAO IBM,A
	PUSHJ P,ESTAT			;NOW WAIT FOR TERMINATION OF LAST READ
	SOJA E,REREAD
	JRST ECHKB
	ADDI D,RETLEN			;THIS ASSUMES RETLEN ≤ RECLEN
	CAIE E,1			;RECORD 0?
	ADDI D,RECLEN-RETLEN		;NO, MAKE IT RECORD LENGTH
	JRST RSTUFF

RWDONE:	PUSHJ P,ESTAT			;WAIT FOR END OF FINAL READ
	SOJA E,REREAD
	CAIA
	JRST CPOPJ1			;SUCCESS
ECHKB:	SUBI E,1
ECHKA:	PUSH P,A
	PUSH P,B
	PUSH P,C
	PUSH P,D
	PUSH P,E
	PUSHJ P,ESENSE
	POP P,E
	POP P,D
	POP P,C
	POP P,B
	POP P,A
	SOSL ECOUNT
	JRST REREAD
	POPJ P,

ECHK:	SOSL ECOUNT
	JRST REDAGN
	POPJ P,



RSRCH1:	AOS T,SRCNUM
	CAIG T,100
	JRST RSRCH2
	OUTSTR[ASCIZ/TOO MANY LOSING SEARCHES!
/]
	JRST ESENSE

RSRCH2:	PUSH P,A
	MOVE A,ADDR
	TRO A,3			;NO-OP TO CLEAR CHAINING
	CONSO PMP,CHE		;WAIT FOR COMMAND HOLD EMPTY
	JRST .-1
	PUSHJ P,XCTCMD
	JRST [	POP P,(P)
		POPJ P,]
	POP P,A
	JRST RSRCH

RSRCH3:	CONO IBM,RESET
	MOVEI T,400000
	CONSO IBM,NOPLIN
	SOJG T,.-1
	JUMPG T,RSRCH
	OUTSTR[ASCIZ/OPL IN NEVER FELL!
/]
	JRST ESENSE


;THE FOLLOWING CODE READS GRIMM'S FAIRY TALES FROM A 370 FORMAT PACK.

COMMENT %
BEGIN	XREAD			;READ ONLY, OS-370 FORMAT
	GLOBAL	T,TT,A,B,C,D,E,IBM,PMP,P,ISTAT
↑XREAD:	MOVEI	T,CHAIN!DT!6!BY4	;4 BYTE MODE
	MOVEM	T,RWCMD		;SAVE READ/WRITE COMMAND
	MOVEI	T,=61*3		;NUMBER OF RECORDS*3
	MOVEM	T,ECOUNT
REDAGN:	PUSHJ	P,SEEKIT	;DO SEEK
	JRST	ECHK
	SETZM	BNDAT
	SETZM	BNDAT+1
	MOVE	T,TRACK
	IDIVI	T,TRKCYL
	DPB	T,WNCYL
	DPB	TT,WNHD
	MOVE	A,ADDR
	TRO	A,DT!BY4!CB!CHAIN!SMF!61	;SEARCH ID EQUAL
	MOVEI	B,BNDAT
	MOVE	C,ADDR
	TDO	C,RWCMD
	MOVE	D,RWLOC			;DATA GOES TO (COMES FROM) HERE
	MOVEI	E,1			;FIRST RECORD NUMBER
REREAD:	DPB	E,WNRN
	SETZM	SRCNUM
RSRCH:	DATAO	PMP,B
	DATAO	IBM,A
RSTUFF:	CONSO	PMP,CHE			;WAIT FOR COMMAND HOLD EMPTY
	JRST	.-1
	CAIL	E,=61			;IS THIS LAST RECORD YET?
	TRZ	C,CHAIN			;YES. CLEAR CHAINING
	DATAO	PMP,D
	DATAO	IBM,C
	PUSHJ	P,ESTAT			;WAIT FOR ENDING STATUS OF SEARCH
	JRST	RSRCH1			;RETRY SEARCH
	JRST	ECHKA
	TRNN	ISTAT,STMOD		;STATUS MODIFIER?
	JRST	RSRCH1			;NO, TRY AGAIN
	SETZM	SRCNUM			;RESET SEARCH COUNT
	ADDI	E,1			;ADVANCE TO NEXT RECORD
	CAILE	E,=61			;IS THIS THE LAST RECORD TO READ?
	JRST	RWDONE			;YES.
	DPB	E,WNRN
	CONSO	PMP,CHE
	JRST	.-1
	DATAO	PMP,B
	DATAO	IBM,A
	PUSHJ	P,ESTAT			;NOW WAIT FOR TERMINATION OF LAST READ
	SOJA	E,REREAD		;LAST READ LOST.. BACKUP AND RETRY
	JRST	ECHKB
	ADDI	D,=20			;80 BYTES = 20 WORDS.  ADVANCE MA
	JRST	RSTUFF

RWDONE:	PUSHJ P,ESTAT			;WAIT FOR END OF FINAL READ
	SOJA E,REREAD
	CAIA
	JRST CPOPJ1			;SUCCESS
ECHKB:	SUBI E,1
ECHKA:	PUSH P,A
	PUSH P,B
	PUSH P,C
	PUSH P,D
	PUSH P,E
	PUSHJ P,ESENSE
	POP P,E
	POP P,D
	POP P,C
	POP P,B
	POP P,A
	SOSL ECOUNT
	JRST REREAD
	POPJ P,

ECHK:	SOSL ECOUNT
	JRST REDAGN
	POPJ P,



RSRCH1:	AOS T,SRCNUM
	CAIG T,100
	JRST RSRCH2
	OUTSTR[ASCIZ/TOO MANY LOSING SEARCHES!
/]
	JRST ESENSE

RSRCH2:	PUSH P,A
	MOVE A,ADDR
	TRO A,3			;NO-OP TO CLEAR CHAINING
	CONSO PMP,CHE		;WAIT FOR COMMAND HOLD EMPTY
	JRST .-1
	PUSHJ P,XCTCMD
	JRST [	POP P,(P)
		POPJ P,]
	POP P,A
	JRST RSRCH

RSRCH3:	CONO IBM,RESET
	MOVEI T,400000
	CONSO IBM,NOPLIN
	SOJG T,.-1
	JUMPG T,RSRCH
	OUTSTR[ASCIZ/OPL IN NEVER FELL!
/]
	JRST ESENSE
BEND XREAD

BEGIN GRIMM
	GLOBAL	T,P
GRTRK:	=703*=19
GWTRK:	0

GRPACK:	2		;READ PACK
GWPACK:	4		;WRITE PACK

↑GRIMM:	MOVEI	T,=703*=19		;READ TRACK
	MOVEM	T,GRTRK
	SETZM	GWTRK			;WRITE TRACK
GRLOOP:	MOVE	T,GRPACK
	MOVEM	T,DRIVE
	DPB	T,[POINT 3,ADDR,21]
	LDB	T,[POINT 8,ADDR,21]
	DPB	T,[POINT 8,TSTXOR,11]
	MOVE	T,GRTRK
	MOVEM	T,TRACK
	MOVEI	T,TRKBUF+40
	MOVEM	T,RWLOC		;READ DATA INTO TRKBUF+40
	PUSHJ	P,XREAD
	OUTSTR	[ASCIZ/READ ERROR
/]
	MOVE	T,GWPACK
	MOVEM	T,DRIVE
	DPB	T,[POINT 3,ADDR,21]
	LDB	T,[POINT 8,ADDR,21]
	DPB	T,[POINT 8,TSTXOR,11]
	MOVE	T,GWTRK
	MOVEM	T,TRACK
	SETZM	RWFIRST		;SET FIRST RECORD NUMBER TO WRITE
	MOVEI	T,RCPTRK	;NORMAL - DO ENTIRE TRACK
	MOVEM	T,RWLAST	;SET LAST RECORD TO WRITE
	MOVEI	T,TRKBUF
	MOVEM	T,RWLOC		;READ DATA INTO TRKBUF
	PUSHJ	P,WRITE
	OUTSTR	[ASCIZ/WRITE ERROR
/]
	AOS	GWTRK
	AOS	T,GRTRK
	CAIG	T,=723*=19+=17
	JRST	GRLOOP
	OUTSTR	[ASCIZ/DONE
/]
	POPJ	P,
BEND GRIMM

END OF COMMENTED PORTION %
FORMAT:	TDZA	T,T
OSFMT:	MOVNI	T,1
	MOVEM	T,OSFMTF		;FLAG SET FOR OS/370 FORMAT
	SKIPE	T
	OUTSTR	[ASCIZ /(OS-370 FORMAT)
/]
	SETZM TRACK
FT0:	MOVEI T,5		;RETRY 5 TIMES IN QUIET MODE
	MOVEM T,CNT
FT1:	PUSHJ P,FTRACK		;FORMAT TRACK
	JRST FLOSE
	AOS T,TRACK		;NEXT TRACK
	CAIG T,MAXTRK		;GREATER THAN MAXIMUM TRACK NUMBER?
	JRST FT0
	OUTSTR[ASCIZ/DONE, /]
	MOVE A,TRACK
	DECPNT A
	OUTSTR[ASCIZ/ TRACKS FORMATTED.
/]
	POPJ P,

FLOSE:	SOSL CNT
	JRST FT1
	ERROR
	OUTSTR[ASCIZ/FORMAT ERROR. /]
	PUSHJ P,GETYES
	POPJ P,			;NO
	JRST FT1		;TRY AGAIN
;FORMAT ONE TRACK
FTRACK:	PUSHJ P,SEEKIT			;DO SEEK
	POPJ P,				;ERROR
	SETZM HADAT
	SETZM HADAT+1
	SETZM B0DAT
	MOVE T,[XWD B0DAT,B0DAT+1]
	BLT T,ENDDAT
	MOVE T,TRACK
	IDIVI T,TRKCYL		;DIVIDE BY TRACKS PER CYLINDER
	DPB T,HACYL
	DPB T,W0CYL
	DPB T,WNCYL
	DPB T,WMCYL
	DPB TT,HAHD
	DPB TT,W0HD
	DPB TT,WNHD
	DPB TT,WMHD
	MOVEI T,RETBYT		;NUMBER OF BYTES OF RETRIEVAL
	SKIPE	OSFMTF		;OS FORMAT?
	MOVEI	T,=8		;YES - 8 BYTES OF DATA IN R0
	DPB T,W0DL1
	LSH T,-=8
	DPB T,W0DL0
	MOVEI T,KEYBYT		;KEY AREA BYTES (R0 ONLY)
	SKIPE	OSFMTF		;OS FORMAT?
	MOVEI	T,0		;YES - NO KEY IN R0
	DPB T,W0KL
	MOVEI T,RECBYT		;NUMBER OF BYTES/RECORD (DATA AREA - NOT RETRIEVAL)
	DPB T,WNDL1
	DPB T,WMDL1
	LSH T,-=8
	DPB T,WNDL0
	DPB T,WMDL0
	MOVE A,ADDR
	TRO A,37!DT!BY4!CB!CHAIN	;SET FILE MASK COMMAND
	MOVEI B,FILMSK		;PERMIT ALL WRITES
	PUSHJ P,XCTCMD		;XCT SET FILE MASK
	POPJ P,			;ERROR
	MOVE C,ADDR
	TRO C,25!DT!BY4!CB!CHAIN;SETUP FOR WRITE RECORD 0
	SKIPE	OSFMTF		;OS FORMAT?
	TRZ	C,CHAIN		;YES.  WRITE R0 IS THE LAST FORMAT OPERATION
	MOVE D,ADDR
	TRO D,35!DT!BY4!CB!CHAIN;SETUP FOR WRITE COUNT KEY AND DATA
	MOVEI E,BNDAT
	MOVEI F,BMDAT
	MOVE A,ADDR
	TRO A,31!DT!BY4!CB!CHAIN;WRITE HOME ADDRESS
	MOVEI B,HADAT
	DATAO PMP,B
	DATAO IBM,A		;WRITE HOME ADDRESS
	CONSO PMP,CHE		;WAIT FOR COMMAND HOLD EMPTY
	JRST .-1
	DATAO PMP,[B0DAT]
	DATAO IBM,C		;WRITE R0
	PUSHJ P,ESTAT		;GET ENDING STATUS OF WRITE HOME ADDRESS
	JFCL
	JRST ESENSE
	SKIPE	OSFMTF		;OS FORMAT?
	JRST	RECLP3		;YES. JUST WAIT FOR WRITE R0 TO FINISH
	MOVEI C,1
RECLOP:	DPB C,WNRN
	CONSO PMP,CHE		;WAIT FOR SPACE
	JRST .-1
	DATAO PMP,E
	DATAO IBM,D
	PUSHJ P,ESTAT
	JFCL
	JRST ESENSE		;ERROR
	ADDI C,1		;NEXT RECORD
	CAIGE C,RCPTRK
	JRST RECLP1
	TRZN D,CHAIN
	JRST RECLP2
RECLP1:	DPB C,WMRN
	CONSO PMP,CHE
	JRST .-1
	DATAO PMP,F
	DATAO IBM,D
	PUSHJ P,ESTAT
	JFCL
	JRST ESENSE
	ADDI C,1
	CAIL C,RCPTRK
	TRZE D,CHAIN
	JRST RECLOP
RECLP2:	PUSHJ P,ESTAT		;WAIT FOR END OF LAST WRITE CKD
	JFCL
	JRST ESENSE		;ERROR
	JRST CPOPJ1		;SUCCESS

RECLP3:	PUSHJ	P,ESTAT		;WAIT FOR END THE WRITE R0  OSFMT COMMAND ONLY!
	JFCL
	JRST	ESENSE		;ERROR
	MOVEI	C,16000		;TIME CONSTANT - WAIT FOR ERASE THAT FOLLOWS WRITE R0
	SOJGE	C,.		;SPIN WHEELS.  AVOID CU BUSY & RELATED LOSSAGE
	JRST	CPOPJ1		;SUCCESS
SEEKIT:	SETZM SKDAT
	SETZM SKDAT+1
	MOVE T,TRACK
	IDIVI T,TRKCYL
	DPB T,SKCYL
	DPB TT,SKHD
	MOVE A,ADDR
	TRO A,7!DT!BY4!CB!CHAIN		;SEEK CYL AND HEAD	;CHAIN 8-15-75
	MOVEI B,SKDAT
	PUSHJ P,XCTCMD
	POPJ P,
	MOVE A,ADDR
	TRO A,3				;NOOP CHAINED FROM SEEK 8-15-75
	PUSHJ P,XCTCMD
	POPJ P,
	JRST CPOPJ1		;YES, ALL DONE

DOSEEK:	PUSHJ P,SEEKIT
	OUTSTR[ASCIZ/SEEK ERROR!
/]
	POPJ P,

HAREAD:	SETZM HADAT
	SETZM HADAT+1
	MOVE A,ADDR
	TRO A,32!DT!BY4!CB
	MOVEI B,HADAT
	PUSHJ P,XCTCMD
	JRST HALOSE
	LDB A,HACYL
	OUTSTR[ASCIZ/CYLINDER = /]
	DECPNT A
	LDB B,HAHD
	OUTSTR[ASCIZ/  HEAD = /]
	DECPNT B
	IMULI A,TRKCYL
	ADD A,B
	OUTSTR[ASCIZ/  TRACK = /]
	DECPNT A
	OUTSTR[ASCIZ/
/]
	POPJ P,

HALOSE:	OUTSTR[ASCIZ/READ HOME ADDRESS FAILED!
/]
	POPJ P,

DORECAL:PUSHJ P,RECAL
	CAIA
	POPJ P,
	PUSHJ P,ESENSE
	OUTSTR[ASCIZ/RECALIBRATE FAILED
/]
	POPJ P,

RECAL:	MOVE A,ADDR
	TRO A,23
	PUSHJ P,DOCMD		;RECALIBRATE
	JRST .-1		;RETRY!
	POPJ P,
	JRST CPOPJ1

SECTOR:	OUTSTR[ASCIZ/SECTOR NUMBER?/]
	PUSHJ P,READN
	JFCL
	CAIE A,12
	CAIN A,15
	CAIA
	JRST ILLSEC
	DPB T,[POINT 8,B0DAT,7]
	MOVE A,ADDR
	TRO A,DT!BY4!CB!43
	MOVEI B,B0DAT
	PUSHJ P,XCTCMD		;ISSUE SET SECTOR
	JRST SECFAI
	MOVE A,ADDR
	TRO A,DT!CB!BY4!22	;READ COUNT
	PUSHJ P,XCTCMD
	JRST SECFAI
	OUTSTR[ASCIZ/RECORD = /]
	LDB A,[POINT 8,B0DAT+1,7]
	DECPNT A
	OUTSTR[ASCIZ/
/]
	POPJ P,

SECFAI:	OUTSTR[ASCIZ\SET SECTOR/READ COUNT FAILED
\]
	POPJ P,

ILLSEC:	PUSHJ P,SKIP
	CAIA				;HE SEEMS TO KNOW IT'S ILLEGAL
	OUTSTR[ASCIZ/ILLEGAL SECTOR!
/]
	POPJ P,

IL2314:	OUTSTR[ASCIZ/NOT AVAILABLE ON 2314!
/]
	POPJ P,

RSECTOR:MOVEI B,B0DAT
	MOVE A,ADDR
	TRO A,DT!CB!BY4!42		;READ SECTOR
	PUSHJ P,XCTCMD
	JRST RSCFAI
	OUTSTR[ASCIZ/SECTOR = /]
	LDB A,[POINT 8,B0DAT,7]
	DECPNT A
	OUTSTR[ASCIZ/
/]
	POPJ P,

RSCFAI:	OUTSTR[ASCIZ/READ SECTOR FAILED.
/]
	POPJ P,
DOSENSE:PUSHJ P,SENSE
	JRST LOSENSE
	MOVEM ISTAT,ISTATC
	PUSHJ P,ERRPNT
	POPJ P,

LOSENSE:MOVEM ISTAT,ISTATC
	PUSHJ P,STTPNT
	PUSHJ P,IBLAST
	POPJ P,

DONOOP:	MOVE A,ADDR
	TRO A,3			;NOOP
	PUSHJ P,XCTCMD
	OUTSTR[ASCIZ/NOOP ERROR!
/]
	POPJ P,

BUFLOG:	MOVEI B,SNSDAT
	MOVE A,ADDR
	TRO A,DT!CB!BY4!244
	PUSHJ P,XCTCMD
	JRST LOGLOS
	OUTSTR[ASCIZ/ERROR-USAGE STATISTICS:
/]
	MOVEI A,0		;START WTH BYTE 0
	MOVE B,[POINT 8,SNSDAT]
BUFLOP:	ILDB C,B
	JUMPE C,BUFLP1
	OUTSTR[ASCIZ/BYTE /]
	DECPNT A
	OUTSTR[ASCIZ/ = /]
	LOCPNT C
	OUTSTR[ASCIZ/
/]
BUFLP1:	CAIGE A,=23
	AOJA A,BUFLOP
	POPJ P,

LOGLOS:	OUTSTR[ASCIZ/READ AND RESET BUFFERED LOG LOST!
/]
	POPJ P,
DIAG:	PUSHJ P,LOAD
	JRST ERLOAD
UDIAG:	MOVEI T,4
	DPB T,[POINT 8,B0DAT,7]
	MOVEI B,B0DAT
	MOVE A,ADDR
	TRO A,DT!BY4!CB!CHAIN!37
	PUSHJ P,XCTCMD			;SET FILE MASK TO PERMIT
	JRST ERDIAG			;DIAGNOSTIC WRITE
	MOVEI B,TSTBUF
	MOVE A,ADDR
	TRO A,CB!BY4!DT!CHAIN!163		;DIAGNOSTIC WRITE
	PUSHJ P,XCTCMD
	JRST ERDIAG
	MOVEI B,ERRBUF
	MOVE A,ADDR
	TRO A,DT!CB!BY4!104		;READ DIAGNOSTIC STATUS 1
	PUSHJ P,XCTCMD
	JRST ERRERR
	POPJ P,

DOLOAD:	PUSHJ P,LOAD
ERLOAD:	OUTSTR[ASCIZ/LOADING ERROR!
/]
	POPJ P,

ERDIAG:	OUTSTR[ASCIZ/ERROR IN DIAGNOSTIC WRITE!
/]
	POPJ P,

ERRERR:	OUTSTR[ASCIZ/ERROR IN READ DIAGNOSTIC STATUS 1.
/]
	POPJ P,

LOAD:	OUTSTR[ASCIZ/HEX TEST ADDR?/]
	PUSHJ P,HEXIN
	CAIG T,377
	CAIE A,15
	JRST ILDADR
	DPB T,[POINT 8,B0DAT,7]
	MOVEI B,B0DAT
	MOVE A,ADDR
	TRO A,DT!CB!BY4!CHAIN!123
	PUSHJ P,XCTCMD			;DIAGNOSTIC LOAD
	POPJ P,
	MOVEI B,TSTBUF
	MOVE A,ADDR
	TRO A,DT!CB!BY4!104
	PUSHJ P,XCTCMD			;READ DIAGNOSTIC STATUS 1
	POPJ P,
	JRST CPOPJ1

ILDADR:	OUTSTR[ASCIZ/ILLEGAL HEX ADDRESS!
/]
	POPJ P,

HEXIN:	SETZ T,
HEXIN1:	GETCHR A
	CAIG A,"9"
	CAIGE A,"0"
	CAIA
	JRST ISDIG
	CAIG A,"F"
	CAIGE A,"A"
	POPJ P,
	SUBI A,"A"-"9"-1
ISDIG:	IMULI T,=16
	ADDI T,-60(A)
	JRST HEXIN1
DOCMD:	TRNE A,20000		;SHOULD WE SEND WCMA
	DATAO PMP,B		;SEND WCMA
	DATAO IBM,A		;AND COMMAND
ESTAT:	MOVSI T,4		;ABOUT 4 SECONDS
ESTAT0:	CONSZ PMP,UNEND!NEWST
	JRST ESTAT1
	SOJG T,ESTAT0
	JRST CPOPJ1

ESTAT1:	GETSTAT
	XOR ISTAT,TSTXOR
	TDNE ISTAT,[377B11]		;SOMEBODY ELSE?
	JRST RNDINT			;RANDOM INTERRUPT
	XOR ISTAT,TSTXOR
	TRNE ISTAT,UNEND!UXCPTN		;UNEND, ILL STATUS
	JRST ILLCHK
	TRNE ISTAT,CHEND
	TRNE ISTAT,DEVEND
	JRST CPOPJ2
	JRST ESTAT

RNDINT:	XOR ISTAT,TSTXOR
	OUTSTR[ASCIZ/ASYNCHRONOUS INTERRUPT
DRIVE = /]
	LDB T,[POINT 3,ISTAT,11]
	PUTCHR 60(T)
	LDB T,[POINT 5,ISTAT,8]
	CAIE T,D3330
	OUTSTR[ASCIZ/ UNKNOWN DEVICE CODE/]
	OUTSTR[ASCIZ/

/]
	JRST ESTAT			;WAIT FOR REAL STATUS

ILLCHK:	SKIPE DEBUG
	PUSHJ P,DDTCAL
	TRNN ISTAT,STMOD		;MUST BE ON FOR CU BUSY OR RETRY STATUS!
	JRST CPOPJ1			;ERROR
	TRNE ISTAT,BUSY			;CU BUSY?
	JRST CUBUSY
	TRNN ISTAT,UCHK			;RETRY?
	JRST CPOPJ1			;ERROR
	AOS RTYCNT
	TRNE ISTAT,DEVEND		;DEVICE END ALREADY?
	JRST CPOPJ1				;YES, INDICATE RETRY
	MOVEI TT,;DEVEND
WAIT:	MOVSI T,4
	CONO IBM,CLRCHL			;CLEAR NEW STATUS, UNEND, AND CMD HOLD LOADED
	CONSO PMP,UNEND!NEWST
	SOJG T,.-1
	JUMPLE T,CPOPJ1		;ERROR
	GETSTAT
	TRNN ISTAT,UNEND!UXCPTN
	TDNN ISTAT,TT		;DID WE GET WHAT WE WANTED?
	JRST CPOPJ1		;NO, ERROR
	POPJ P,			;INDICATE RETRY STATUS

CUBUSY:	AOS CUBCNT
	TRNE ISTAT,CUEND	;CUEND WITH CU BUSY?
	POPJ P,			;YES, INDICATE RETRY STATUS
	MOVEI TT,CUEND
	JRST WAIT

XCTCMD:	PUSHJ P,DOCMD
	JRST XCTCMD		;RETRY STATUS!
	JRST ESENSE		;ERROR, DO SENSE
	JRST CPOPJ1

SENSE:	MOVE A,ADDR
	TRO A,4!DT!BY4!CB	;SENSE
	MOVEI B,SNSDAT
	MOVEI C,10		;RETRY TEN TIMES AT MOST!
	PUSHJ P,DOCMD		;DO SENSE
	SOJG C,.-1		;RETRY STATUS
	POPJ P,
	JRST CPOPJ1
ESENSE:	AOS ERRCNT
	MOVEM ISTAT,ISTATC
	SKIPN QUIET
	PUSHJ P,STTPNT
	PUSHJ P,BLAST
	PUSHJ P,SENSE
	JRST LOSEN1
	LDB A,[POINT 8,SNSDAT,7]
	TRNE A,1
	JRST ISSKCK
	TRNN A,20
	JRST NOSKCK
	LDB A,[POINT 8,SNSDAT+1,31]
	CAIE A,52
	CAIN A,53
	CAIA
	JRST NOSKCK
ISSKCK:	PUSHJ P,RECAL			;RECALIBRATE HYDRAULICS(ELCTRONICS)
	OUTSTR[ASCIZ/RECALIBRATE FAILED!
/]
NOSKCK:	SKIPE QUIET
	POPJ P,
	CAIA
ERRPNT:	PUSHJ P,STTPNT
	LDB A,[POINT 8,SNSDAT,7]	;FIRST SENSE BYTE
	MOVEI B,7
SNTY0:	TRNE A,200
	OUTSTR @SNBY0(B)
	LSH A,1
	SOJGE B,SNTY0
	MOVEI B,7
	LDB A,[POINT 8,SNSDAT,15]
SNTY1:	TRNE A,200
	OUTSTR @SNBY1(B)
	LSH A,1
	SOJGE B,SNTY1
	LDB A,[POINT 8,SNSDAT+1,7]
	CAIN A,10
	SKIPA A,[11]
	ANDI A,7
	ADDI A,1
	ADDI A,100
	OUTSTR[ASCIZ/DRIVE = /]
	PUTCHR @A
	LDB A,[POINT 5,ISTATC,8]
	CAIE A,D3330
	OUTSTR[ASCIZ/
ILLEGAL DEVICE ADDRESS/]
	OUTSTR[ASCIZ/
SENSE DATA:
/]
	MOVE A,[POINT 8,SNSDAT]
	MOVEI B,=24
	SETZ D,
BYTLOP:	ILDB C,A
	JUMPE C,BYTLP1
	OUTSTR[ASCIZ/BYTE /]
	DECPNT D
	OUTSTR[ASCIZ/ = /]
	LOCPNT C
	OUTSTR[ASCIZ/
/]
BYTLP1:	ADDI D,1
	SOJG B,BYTLOP
CNTPNT:	SKIPN RTYCNT
	JRST CUBPNT
	OUTSTR[ASCIZ/RTYCNT = /]
	DECPNT RTYCNT
	OUTSTR[ASCIZ/
/]
	SETZM RTYCNT
CUBPNT:	SKIPN CUBCNT
	JRST ERRP
	OUTSTR[ASCIZ/CUBCNT = /]
	DECPNT CUBCNT
	OUTSTR[ASCIZ/
/]
	SETZM CUBCNT
ERRP:	SKIPN ERRCNT
	POPJ P,
	OUTSTR[ASCIZ/ERRCNT = /]
	DECPNT ERRCNT
	OUTSTR[ASCIZ/
/]
	SETZM ERRCNT
	POPJ P,
STTPNT:	OUTSTR[ASCIZ/CONI BITS = /]
	OCTPNT ISTATC
	OUTSTR[ASCIZ/
PACK = /]
	LDB A,[POINT 3,ISTATC,11]
	PUTCHR 60(A)
	OUTSTR[ASCIZ/  TRACK = /]
	DECPNT TRACK
	OUTSTR[ASCIZ/
/]
	MOVE A,ISTATC
	TLNE A,200000		;NXM?
	OUTSTR[ASCIZ/NON-EX-MEM
/]
	TLNE A,40000
	OUTSTR[ASCIZ/SELECT ERROR
/]
	TLNE A,40
	OUTSTR[ASCIZ/DISK PARITY ERROR
/]
	TLNE A,20
	OUTSTR[ASCIZ/CORE PARITY ERROR
/]
	LDB A,[POINT 8,ISTATC,30]
	MOVSI B,-DSTATL
STATLP:	HLRZ C,DSTAT(B)
	CAME C,A
	AOBJN B,STATLP
	JUMPGE B,ILSTAT
	HRRZ C,DSTAT(B)
	OUTSTR @C
	OUTSTR[ASCIZ/
/]
	POPJ P,

ILSTAT:	MOVEI B,7
	TRNE A,1
	OUTSTR @STATAB(B)
	LSH A,-1
	SOJG B,.-3
	POPJ P,

LOSEN1:	OUTSTR[ASCIZ/SENSE LOST!
/]
	PUSHJ P,IBLAST
	POPJ P,

	
	

BLAST:	CONI PMP,T
	TLNE T,SELERR		;SELECT ERROR?
IBLAST:	CONO IBM,RESET!IRESET	;RESET CHANNEL AND DISK CONTROL
	MOVEI T,3
BLAST1:	MOVEI TT,4000
	CONO IBM,RESET		;RESET CHANNEL SOME MORE
	SOJG TT,.
	SOJG T,BLAST1
	POPJ P,

END STRT